﻿#region

using System.Collections.Generic;
using System.Linq;
using Tateeda.ClinicalStudy.Base.Data.DBModel;
using Tateeda.ClinicalStudy.Base.Modules.Models.StudyForm;

#endregion

#region - Legal -

///<legal>
/// Copyright © 2011, Tateeda Media Network
/// All rights reserved. http://tateeda.com
///
/// Redistribution and use in source and binary forms, with or without
/// modification, are permitted provided that the following conditions
/// are met:
///
/// - Redistributions of source code must retain the above copyright
/// notice, this list of conditions and the following disclaimer.
///
/// - Neither the name of the Tateeda Media Network, nor the names of its
/// contributors may be used to endorse or promote products
/// derived from this software without specific prior written
/// permission.
///
/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
/// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
/// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
/// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
/// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
/// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING,
/// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
/// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
/// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
/// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
/// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
/// POSSIBILITY OF SUCH DAMAGE.
///</legal>

#endregion - Legal -

namespace Tateeda.ClinicalStudy.Base.Modules.Common.Extenstions {

    public static class FormExtention {

        public static Answer ToAnswer(this AnswerModel answerModel) {
            var to = new Answer();
            To(answerModel, ref to);
            return to;
        }

        public static AnswerModel ToAnswerModel(this Answer answer) {
            var to = new AnswerModel();
            To(answer, ref to);
            return to;
        }

        public static ICollection<AnswerModel> ToAnswerModelList(this ICollection<Answer> answers) {
            return answers.Select(a => a.ToAnswerModel()).ToList();
        }

        public static Form ToForm(this StudyFormModel formModel) {
            var to = new Form();
            To(formModel, ref to);
            return to;
        }

        public static ICollection<Form> ToFormList(this ICollection<StudyFormModel> forms) {
            return forms.Select(f => f.ToForm()).ToList();
        }

        public static StudyFormModel ToFormModel(this Form form) {
            var to = new StudyFormModel();
            To(form, ref to);
            return to;
        }

        public static ICollection<StudyFormModel> ToFormModelList(this ICollection<Form> forms) {
            return forms.Select(f => f.ToFormModel()).ToList();
        }

        public static Question ToQuestion(this QuestionModel questionModel) {
            var q = new Question();
            To(questionModel, ref q);
            return q;
        }

        public static QuestionModel ToQuestionModel(this Question question) {
            var qm = new QuestionModel();
            To(question, ref qm);
            return qm;
        }

        public static ICollection<QuestionModel> ToQuestionModelList(this ICollection<Question> questions) {
            return questions.Select(q => q.ToQuestionModel()).ToList();
        }

        public static FormAnswerModel ToFormAnswerModel(this FormAnswer formAnswer) {
            var to = new FormAnswerModel();
            To(formAnswer, ref to);
            return to;
        }

        public static FormAnswer ToFormAnswer(this FormAnswerModel formAnswerModel) {
            var to = new FormAnswer();
            To(formAnswerModel, ref to);
            return to;
        }

        public static AppointmentFormModel ToAppointmentFormModel(this AppointmentForm form) {
            var to = new AppointmentFormModel();
            To(form, ref to);
            return to;
        }

        public static AppointmentForm ToAppointmentForm(this AppointmentFormModel formModel) {
            var to = new AppointmentForm();
            To(formModel, ref to);
            return to;
        }

        public static ICollection<AppointmentFormModel> ToAppointmentFormModelList(this ICollection<AppointmentForm> forms) {
            return forms.Select(f => f.ToAppointmentFormModel()).ToList();
        }

        public static ICollection<AppointmentForm> ToAppointmentFormList(this ICollection<AppointmentFormModel> forms) {
            return forms.Select(f => f.ToAppointmentForm()).ToList();
        }

        #region - Base function for Objects conversions -

        private static void To<TF, T>(TF from, ref T to) {
            ExtensionBase.To(from, ref to);
        }

        #endregion - Base function for Objects conversions -
    }
}